package com.org.oracle.config;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.json.JSONUtil;
import com.org.oracle.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author: heiye
 * @date: 2024/10/11 上午10:42
 * @version: v1.0.0
 * @description: [Sa-Token 权限认证] 配置类
 */
@Slf4j
@Configuration
public class SaTokenConfig {
    /**
     * 注册 [Sa-Token全局过滤器]
     */
    @Bean
    public SaServletFilter getSaServletFilter() {
        return new SaServletFilter()
                // 指定 拦截路由 与 放行路由
                .addInclude("/**")
                // 认证函数: 每次请求执行
                .setAuth(obj -> {
                    log.info("==================> SaServletFilter, Path: {}", SaHolder.getRequest().getRequestPath());

// ======================== 拦截所有路由 ========================
                    SaRouter.match("/**")

                            // 用户微信登录接口
                            .notMatch("/user/wxLogin")

// ======================== 排除知识圈接口 ========================
                            // 查-知识圈 查全部
                            .notMatch("/circle/findAll")
                            // 根据标签查知识圈
                            .notMatch("/circle/findByTag")
                            // 根据词汇搜索知识圈
                            .notMatch("/circle/findByWord")
                            // 查找用户已加入的知识圈
                            .notMatch("/circle/findByUser")
                            // 用户加入知识圈
                            .notMatch("/circle/findComment")

// ======================== 排除话题ai接口 ========================
                            // 得到所有ai
                            .notMatch("/topic/findAll")
                            // 得到20组权重最高的ai
                            .notMatch("/topic/findList")
                            // 根据 知识圈id 查找对应的 话题ai
                            .notMatch("/topic/findAi")

// ======================== 排除学习积分榜接口 ========================
                            // 查找榜单的积分排名
                            .notMatch("/studyPointList/findPointsList")

// ======================== 排除知识库接口 ========================
                            // 模糊查询标题返回多条知识库
                            .notMatch("/knowledgeBase/find")

                            // 校验是否登录
                            .check(r -> StpUtil.checkLogin());

                })
                // 手动抛出异常
                .setError(e -> {
                    log.error("==================> SaServletFilter, catchError: {}", e.getMessage());
                    // 未登录异常
                    if (e instanceof NotLoginException) {
                        return JSONUtil.toJsonStr(Result.fail(e.getMessage()));
                    }
                    // 权限不足，或不具备角色，统一抛出权限不足异常
                    else if (e instanceof NotPermissionException || e instanceof NotRoleException) {
                        return JSONUtil.toJsonStr(Result.fail(e.getMessage()));
                    }
                    // 其他异常，则抛出一个运行时异常
                    else {
                        return JSONUtil.toJsonStr(Result.fail(e.getMessage()));
                    }
                });
    }
}

